home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / netdde.nasl < prev    next >
Text File  |  2005-01-14  |  4KB  |  202 lines

  1. #
  2. # (C) Tenable Network Security
  3. #
  4.  
  5. if(description)
  6. {
  7.  script_id(15572);
  8.  script_bugtraq_id(11372);
  9.  script_cve_id("CAN-2004-0206");
  10.  
  11.  script_version("$Revision: 1.3 $");
  12.  name["english"] = "Vulnerability NetDDE Could Allow Code Execution (Netbios Check)";
  13.  
  14.  script_name(english:name["english"]);
  15.  
  16.  desc["english"] = "
  17. The remote version of Windows is affected by a vulnerability in 
  18. Network Dynamic Data Exchange (NetDDE).
  19.  
  20. An attacker may exploit this flaw to execute arbitrary code on the remote
  21. host with the SYSTEM privileges.
  22.  
  23. Solution : http://www.microsoft.com/technet/security/bulletin/MS04-031.mspx
  24. Risk factor : High";
  25.  
  26.  script_description(english:desc["english"]);
  27.  
  28.  summary["english"] = "Determines if hotfix 841533 has been installed (Netbios)";
  29.  
  30.  script_summary(english:summary["english"]);
  31.  
  32.  script_category(ACT_GATHER_INFO);
  33.  
  34.  script_copyright(english:"This script is Copyright (C) 2004 Tenable Network Security");
  35.  family["english"] = "Windows";
  36.  script_family(english:family["english"]);
  37.  
  38.  script_dependencies("netbios_name_get.nasl");
  39.  script_require_ports(139);
  40.  script_require_keys("SMB/name");
  41.  exit(0);
  42. }
  43.  
  44. include ('smb_nt.inc');
  45.  
  46. function ntol(buffer,begin)
  47. {
  48.  local_var len;
  49.  
  50.  len = 16777216*ord(buffer[begin+3]) +
  51.        ord(buffer[begin+2])*65536 +
  52.        ord(buffer[begin+1])*256 +
  53.        ord(buffer[begin]);
  54.  
  55.  return len;
  56. }
  57.  
  58.  
  59. function raw_int32(i)
  60. {
  61.  local_var buf;
  62.  
  63.  buf = raw_string (
  64.          (i>>24) & 255,
  65.              (i>>16) & 255,
  66.                  (i>>8) & 255,
  67.                  (i) & 255
  68.          );
  69.  return buf;
  70. }
  71.  
  72.  
  73. function raw_int(i)
  74. {
  75.  local_var buf;
  76.  
  77.  buf = raw_string (
  78.          (i) & 255,
  79.                  (i>>8) & 255,
  80.                  (i>>16) & 255,
  81.                  (i>>24) & 255
  82.          );
  83.  return buf;
  84. }
  85.  
  86.  
  87. function checksum(data)
  88. {
  89.  local_var len, chk, i, dlen;
  90.  
  91.  chk = 0xFFFFFFFF;
  92.  dlen = strlen(data);
  93.  len =  dlen -4;
  94.  
  95.  for (i=0;i<len;i+=4)
  96.     chk += ntol(buffer:data, begin:i);
  97.  
  98.  while (i < dlen)
  99.  {
  100.   chk += ord(data[i]);
  101.   i++;
  102.  }
  103.  
  104.  return raw_int(i:chk);
  105. }
  106.  
  107.  
  108. function netbios(data)
  109. {
  110.  return  raw_int32(i:strlen(data)) + data;
  111. }
  112.  
  113.  
  114. function netdde(name,host)
  115. {
  116.  local_var lname,rhost,core,len;
  117.  local_var name_hi,name_low,rhost_hi,rhost_low,core_hi,core_low;
  118.  local_var main,header,data;
  119.  
  120.  lname = name + raw_string(0x01);
  121.  rhost = host + raw_string(0x01);
  122.  core = "CORE1.0" + raw_string(0x01);
  123.  
  124.  #lname length
  125.  len = strlen(lname);
  126.  name_hi = len / 256;
  127.  name_low = len % 256;
  128.  
  129.  #rhost length
  130.  len = strlen(rhost) + strlen(lname);
  131.  rhost_hi = len / 256;
  132.  rhost_low = len % 256;
  133.  
  134.  #core length
  135.  len = strlen(core);
  136.  core_hi = len / 256;
  137.  core_low = len % 256;
  138.  
  139.  main = raw_string(0x01,0x00,0xBE,0x05,0x0A,0x00,0x00,name_hi,name_low,rhost_hi,rhost_low,core_hi,core_low,0x00) + lname + rhost + core + raw_string(0x2E);
  140.  
  141.  len = strlen(main);
  142.  len_hi = len / 256;
  143.  len_low = len % 256;
  144.  
  145.  header = raw_string(
  146.  0x45,0x44,0x44,0x4E,0x00,0x00,0x00,
  147.  len_hi,len_low,
  148.  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  149.  len_hi,len_low,
  150.  0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00) +
  151.  #raw_string(0x82,0x8D,0xCB,0x3D);
  152.  checksum(data:main);
  153.  
  154.  data = checksum(data:header) + header + main;
  155.  
  156.  data += raw_string(0x0d,0x12,0x0b,0x06,0x0d,0x18,0x1c,0x01,0x10,0x03,0x12,0x08,0x1d,0x1f,0x0a,0x0a,0x16,0x02,0x17,0x0e,0x1b,0x0d);
  157.  
  158.  data += crap(data:raw_string(0x03), length:0x19);
  159.  
  160.  data = netbios(data:data);
  161.  
  162.  return data;
  163. }
  164.  
  165. hname = kb_smb_name();
  166. if ( ! hname ) exit(0);
  167.  
  168. port = 139;
  169. soc = open_sock_tcp(port);
  170. if ( ! soc ) exit(0);
  171.  
  172.  
  173. session_request = raw_string(0x81, 0x00, 0x00, 0x44) + 
  174.           raw_string(0x20) +
  175.           netbios_encode(data:hname, service:0x1F) +
  176.                   raw_string(0x00, 0x20) + 
  177.           "CACACACACACACACACACACACACACACABP" +
  178.           raw_string(0x00);
  179.  
  180. send(socket:soc, data:session_request);
  181. r = smb_recv(socket:soc, length:4000);
  182. if ( ! r ) exit(0);
  183.  
  184. if(ord(r[0])!=0x82)
  185.  exit(0);
  186.  
  187. data = netdde(name:"NESSUS", host:hname);
  188.  
  189. send(socket:soc, data:data);
  190. r = smb_recv(socket:soc, length:4000);
  191.  
  192. if (!r && (strlen(r) < 12))
  193.   exit(0);
  194.  
  195. chk = substr(r,8,11);
  196.  
  197. if( "EDDN" >< chk)
  198. {
  199.  security_hole(port);
  200.  exit(0);
  201. }
  202.